10

別のキーでデータベースを検索したい。入力に応じて、1キーから10キーの場合があります。LinqクエリにOR/AND句を動的に追加する方法はありますか?

 keys[k] // I have my keys in this array 
 var feedList = (from feed in ctx.Feed
                 where feed.content.contains(keys[0]) 
                       && feed.content.contains(keys[1])
                       && ... // continues with the keys.length
                 select new {
                    FeedId = feed.DuyuruId,
                    FeedTitle = feed.FeedTitle,
                    FeedContent = feed.FeedContents,
                    FeedAuthor = user.UserName + " " +User.UserSurname
 }
4

5 に答える 5

14

.Allすべてのキーをチェックする句を試すことができます。

where keys.All(key => feed.content.contains(key))
于 2013-01-14T14:17:44.100 に答える
7

AND句の場合、これは単純です。

var feedList = from feed in ctx.Feed;
foreach(var key in keys){
    feedList = feedList.Where(x=> content.contains(key));
}
var resultQuery = feedList.Select(x=> new {....});

ORの場合、 LinqKitとその述語を使用Expressionsまたは試す必要があります。

var predicate = PredicateBuilder.False<TypeOfYourEntity>();
foreach(var key in keys){
    predicate = predicate.Or(x=> content.contains(key));
}
var resultQuery = ctx.Feed.Where(predicate).Select(x=> new {....});
于 2013-01-14T14:21:42.793 に答える
3

LINQの拡張メソッドを使用できます

ctx.Feed.Where(f => {  
//Your logic here
if(something != null){
      return f.Property == something
  } 
}).Select( new { FeedId = feed.DuyuruId,
                    FeedTitle = feed.FeedTitle,
                    FeedContent = feed.FeedContents,
                    FeedAuthor = user.UserName + " " +User.UserSurname })
于 2013-01-14T14:14:17.493 に答える
2

あなたはこのようなことをすることができます。オーバーヘッドが発生する可能性があることを忘れないでください

 var students = ctx.Students;

 if (!String.IsNullOrWhiteSpace(SearchParams.Name))
      students = from s in students where s.Name.StartsWith(SearchParams.Name)

 if (!String.IsNullOrWhiteSpace(SearchParams.Surname))
      students = from s in students where s.Surname.StartsWith(SearchParams.Surname)
于 2013-01-14T14:19:31.273 に答える
2

linqかなり動的なクエリを必要とする人を助けるために、@mellamokbの回答が私のシナリオでどのように機能したかの例を提供したいと思いました。

私の例では、datatableクラスの拡張を行っただけなので、データベースにデータの行が存在するかどうかを確認できるため、SQL主キーの例外はスローされません。

/// <summary>
/// 
/// </summary>
/// <param name="DT"></param>
/// <param name="ColumnNames">Columns to check in affected table.</param>
/// <param name="ItemtoChecks">Values to check in affected column.</param>
/// <returns></returns>
public static bool TableContains(this DataTable DT, string[] ColumnNames, object[] ItemtoChecks)
{
  var result = from row in DT.AsEnumerable()
               where ColumnNames.All(
               r => row.Field<object>(r).ToString() == Convert.ToString(
                 ItemtoChecks[ColumnNames.ToList()
                 .FindIndex(p => p.Equals(r, StringComparison.OrdinalIgnoreCase))]))
               select row;                   
  return (result.Count() > 0);
}

このメソッドを使用すると、必要な数の列名をstring[]対応する値とともにに追加して、個別にチェックインできますobject[]。クエリはをチェックしdatatable、一致するものが見つかった場合はメソッドが返し、一致しtrueない場合はを返しますfalse

于 2017-03-29T18:56:43.607 に答える