LINQ к SQL - выбирают где текст как массив строк

Эта фраза

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
7
задан pirho 26 February 2018 в 08:22
поделиться

2 ответа

Проверьте эту статью, чтобы сделать то, что Вы хотите:
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),

11
ответ дан 6 December 2019 в 10:54
поделиться

довольно в новинку для целого 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/

6
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: