Эта фраза
let table = [1;2;3] in (List.length table) |> permuteBool
является высшим (глобальным) выражением. Такое выражение необходимо отделить от определений верхнего уровня двойной точкой с запятой:
let rec permuteBool n =
match n with
| 0 -> [[]]
| k -> (List.map (fun x-> true::x) (permuteBool (n-1))) @
(List.map (fun x -> false::x) (permuteBool (n-1)))
;; let table = [1;2;3] in (List.length table) |> permuteBool
Когда вы ввели две фразы по отдельности, вы случайно написали эту требуемую двойную точку с запятой ;;
, таким ошибка исчезла.
Более идиоматический подход состоит в том, чтобы всегда связывать такое выражение в определении верхнего уровня:
let rec permuteBool n =
match n with
| 0 -> [[]]
| k -> (List.map (fun x-> true::x) (permuteBool (n-1))) @
(List.map (fun x -> false::x) (permuteBool (n-1)))
let _ = (* here _ is used to discard the result *)
let table = [1;2;3] in (List.length table) |> permuteBool
или, если вы не хотите отбрасывать результат:
let result = (* here _ is used to discard the result *)
let table = [1;2;3] in (List.length table) |> permuteBool
Проверьте эту статью, чтобы сделать то, что Вы хотите:
http://www.albahari.com/nutshell/predicatebuilder.aspx
Это работает как мечта. Я по существу вырезал и вставил их код и вернул это (с моей собственной схемой данных, конечно):
SELECT [t0].[Id], [t0].[DateCreated], [t0].[Name] ...
FROM [dbo].[Companies] AS [t0]
WHERE ([t0].[Name] LIKE @p0) OR ([t0].[Name] LIKE @p1)
Вот код, который я выполнил для подтверждения концепции:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace PredicateTest
{
class Program
{
static void Main(string[] args)
{
DataClasses1DataContext dataContext = new DataClasses1DataContext();
Program p = new Program();
Program.SearchCompanies("test", "test2");
var pr = from pi in dataContext.Companies.Where(Program.SearchCompanies("test", "test2")) select pi;
}
DataClasses1DataContext dataContext = new DataClasses1DataContext();
public static Expression<Func<Company, bool>> SearchCompanies(
params string[] keywords)
{
var predicate = PredicateBuilder.False<Company>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or(p => p.Name.Contains(temp));
}
return predicate;
}
}
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}
}
Я предложил бы идти в сайт для кода и объяснения.
(Я оставляю первый ответ, потому что он работает хорошо при необходимости в операторе IN),
довольно в новинку для целого LINQ к игре SQL, но этого синтаксиса помогает?
string[] items = new string[] { "a", "b", "c", "d" };
var items = from i in db.Items
where items.Contains(p.text)
select i;
Получил его от:
http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/