我试图从一个表中选择行(其中一个(NVARCHAR)列在数值范围内).
SELECT ID, Value
FROM Data
WHERE ISNUMERIC(Value) = 1 AND CONVERT(FLOAT, Value) < 66.6
Run Code Online (Sandbox Code Playgroud)
不幸的是,作为SQL规范的一部分,AND子句不必短路(并且不在MSSQL Server EE 2008上).更多信息:SQL WHERE子句的短路评估是什么?
我的下一次尝试是尝试这个,看看我是否可以延迟评估CONVERT
SELECT ID, Value
FROM Data
WHERE (CASE WHEN ISNUMERIC(Value) = 1 THEN CONVERT(FLOAT, Value) < 66.6 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)
但我似乎无法使用CONVERT的结果<(或任何比较).它因错误而失败
Incorrect syntax near '<'.
Run Code Online (Sandbox Code Playgroud)
我可以逃脱
SELECT ID, CONVERT(FLOAT, Value) AS Value
FROM Data
WHERE ISNUMERIC(Value) = 1
Run Code Online (Sandbox Code Playgroud)
所以显而易见的解决方案是将整个select语句包装在另一个SELECT和WHERE中,并从内部select和filter中返回转换后的值,在那里选择外部select.不幸的是,这是我的Linq-to-sql问题的来源.我不仅过滤了一个范围,而且过滤了很多,或者只是记录的存在(有一些日期范围选择和比较我遗漏了. )
基本上我希望能够生成这样的东西:
SELECT ID, TypeID, Value
FROM Data
WHERE (TypeID = 4 AND ISNUMERIC(Value) AND CONVERT(Float, Value) < 66.6)
OR …Run Code Online (Sandbox Code Playgroud) 我有一个我需要在表中匹配的部分字符串列表.我正在使用PredicateBuilder.
var predicate = PredicateBuilder.False<Name>();
List<string> names = new List<string>();
names.Add("test name"); **<===matches**
names.Add("test"); **<=== doesn't match**
predicate = predicate.Or(n => names.Contains(n.Company));
var results = (from n in Names
.AsExpandable()
.Where(predicate)
select(new{ n.Company}));
Run Code Online (Sandbox Code Playgroud)
n.Company ="测试名称"
如果n.Company正好是"测试名称",那么这将匹配,但如果我只使用"test"则它不匹配.如何匹配列表中的部分.包含?
我已经下载了谓词构建器,并且很难让它与实体框架一起工作.这是我的代码:v_OrderDetail是实体
var context = new OrdersEntities();
Expression<Func<v_OrderDetail,bool>> whereClause = w => true;
var predicate = PredicateBuilder.True<v_OrderDetail>();
predicate.And(w => w.Status == "Work");
var results = context.v_OrderDetail.AsExpandable().Where(predicate);
Run Code Online (Sandbox Code Playgroud)
当我查看结果时,我会收到每个订单.And谓词似乎没有.当我查看predicate.parameters.count时,它只显示1.我不确定,但我希望它在添加第二个后显示2.
任何帮助是极大的赞赏.
我在使用PredicateBuilder动态地将"Or Where"子句添加到LINQ语句时遇到了麻烦.我会先解释一下我想要完成的事情.
我有一个倒排索引,用于存储来自一堆链接标题的关键字.我正在使用一个,所以我可以根据这些关键字快速搜索这些链接.倒排索引是类型
Dictionary<string, List<VerifiedUrl>>
Run Code Online (Sandbox Code Playgroud)
所以基本上每个单词都与包含该单词的URL列表相关联.
我正在进行的下一个阶段是使倒排索引可搜索.因此,当我搜索"蓝色"时,我返回了与键"the"或"blue"相关联的所有链接.在几次Google搜索之后,似乎是通过PredicateBuilder类动态地将"Or Where"子句添加到LINQ语句的最佳方法.我在使用我构建的谓词的最后一步遇到了麻烦.
var invertedIndex = new Dictionary<string, List<VerifiedUrl>>();
//the invertedIndex is built and filled here. Now I am trying to search through it.
Console.WriteLine("\nEnter words to see if there are matches");
string query = Console.ReadLine();
Console.WriteLine();
string[] words = query.Split(',', ' ');
//the predicate I'll be building. I'm not positive it is of the correct type. I've assumed that it should be of the same type as the Dictionary type in the …Run Code Online (Sandbox Code Playgroud) 
一个党可以有一个或多个联系对象.
我想选择所有缔约方谁是streetname包含特定关键字.
如果我只想在Party中搜索,我可以使用下面的代码.但是如何将其扩展到也在Contact中搜索?
public IQueryable<Party> SearchParties(List<string> keywords)
{
var predicate = PredicateBuilder.False<Party>();
foreach (string word in keywords)
{
var keyword = word;
predicate = predicate.Or(p => p.surname.Contains(keyword));
predicate = predicate.Or(p => p.lastname.Contains(keyword));
predicate = predicate.Or(p => p.number.Contains(keyword));
}
return db.Parties.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
还有什么需要知道的吗?
编辑
我想我可以创建另一个谓词,然后加入它们.就像是:
var predicate2 = PredicateBuilder.False<Contact>();
Run Code Online (Sandbox Code Playgroud)
......并且在foreach中:
predicate2 = predicate2.Or(p => p.streetname.Contains(keyword));
Run Code Online (Sandbox Code Playgroud)
但是如何在返回之前加入谓词和谓词2?
EDIT2
或者,在执行谓词生成器之前加入Party和Contact?
EDIT3
以下是生成的类的一部分:
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Contact")]
public partial class Contact : INotifyPropertyChanging, …Run Code Online (Sandbox Code Playgroud) 在我为谓词构建器看到的所有示例中,PredicateBuilder.True如果要构建"和"表达式条件以及PredicateBuilder.False构建"或"表达式条件,它将显示一个起始表达式.
我的问题是,这种情况总是如此,如果是这样的话,为什么不能简单地推断出这一点.我怀疑必定会有一些情况,你正在构建一个"和"表达式,并希望从错误开始.与"或"相反
任何人都可以向我解释这个吗?
我想使用"标准"对象动态构建LinqToSQL和EntityFramework查询子句,如果需要,在Nutshell PredicateBuilder中利用C#(http://www.albahari.com/nutshell/predicatebuilder.aspx)
只是要清楚 - 我不明白如何创建C#表达式; o)
过滤器运算符和值被定义为我的"查询条件"类的属性,如下所示:
public class QueryCriteria
{
public DateTimeFilter DateTimeCompleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
"过滤器"定义为:
public class DateTimeFilter
{
public FilterOperator FilterOperator { get; set; }
public DateTime FilterToken { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而"过滤器运算符"是一个简单的C#枚举:
public enum FilterOperator : int
{
ExactMatch = 1,
BeginsWith = 2,
Contains = 3,
EndsWith = 4,
GreaterThan = 5,
GreaterThanOrEqualTo = 6,
LessThan = 7,
LessThanOrEqualTo = 8,
}
Run Code Online (Sandbox Code Playgroud)
我想使用以下方法在我的存储库中动态构建我的LinqToSQL和EntityFramework查询:
if (criteria.DateTimeCompleted != null)
{
var …Run Code Online (Sandbox Code Playgroud) 我正在使用 PredicateBuilder 针对 Umbraco 节点列表构建查询来过滤搜索结果。我通过 QueryString 将搜索到的 ID 值作为字符串传递,然后将其与列表中每个 Umbraco 节点上的字符串字段进行比较以获取匹配项。
目前,代码对目标字段进行匹配,因为查询字符串中有一个值,效果很好。我需要在 .And() 中添加一个条件,如果该字段有值,则尝试将 QS 与字段字符串进行匹配,但如果该字段没有值,那么它也应该匹配。
if (!string.IsNullOrEmpty(qsId))
{
predicate = predicate.And(i =>
Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" +
qsId + "\\b"));
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但似乎无法正常工作:
if (!string.IsNullOrEmpty(qsId))
{
predicate = predicate.And(i =>
Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" +
qsId + "\\b") ||
string.IsNullOrEmpty(i.GetProperty("makeTag")).Value.ToString());
}
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么或者可能有更好的方法来解决这个问题有什么想法吗?
我使用谓词构建器编写以下代码:
IEnumerable<int> ids= new List<int> { 47, 48 };
var predicate = PredicateBuilder.False<Customer>();
predicate = predicate.And(x => x.CreatedAt >= fromDate && x.CreatedAt <= toDate);
foreach (var id in ids)
{
predicate = predicate.Or(x => x.Source.Id == id);
}
var result = Database.Set<Customer>().AsExpandable()
.Where(predicate)
.ToList();
Run Code Online (Sandbox Code Playgroud)
生成的SQL看起来像(只是WHERE子句):
WHERE ([Filter6].[SourceId] IN (@p__linq__0,@p__linq__1))
AND ([Filter6].[CreatedAt] >= @p__linq__2)
AND ([Filter6].[CreatedAt] <= @p__linq__3)',
N'@p__linq__0 int,
@p__linq__1 int,
@p__linq__2 datetime2(7),
@p__linq__3 datetime2(7)',
@p__linq__0=48,
@p__linq__1=48,
@p__linq__2='2012-02-07 21:59:55.0437985',
@p__linq__3='2012-02-07 22:04:55.5748288'
Run Code Online (Sandbox Code Playgroud)
它看起来像id在SQL中被分配了两次.不知道为什么?
在这里,我试图获得多个术语的搜索结果.说全文="李牛仔裤",然后regexresult = {"lee","jeans"}.
代码:
IProviderSearchContext searchContext = index.CreateSearchContext();
IQueryable<SearchItem> scQuery = searchContext.GetQueryable<SearchItem>();
var predicate = PredicateBuilder.True<SearchItem>();
//checking if the fulltext includes terms within " "
var regexResult = SearchRegexHelper.getSearchRegexResult(fulltext);
regexResult.Remove(" ");
foreach (string term in regexResult)
{
predicate = predicate.Or(p => p.TextContent.Contains(term));
}
scQuery = scQuery.Where(predicate);
IEnumerable<SearchHit<SearchItem>> results = scQuery.GetResults().Hits;
results=sortResult(results);
Run Code Online (Sandbox Code Playgroud)
排序基于sitecore字段:
switch (query.Sort)
{
case SearchQuerySort.Date:
results = results.OrderBy(x => GetValue(x.Document, FieldNames.StartDate));
break;
case SearchQuerySort.Alphabetically:
results = results.OrderBy(x => GetValue(x.Document, FieldNames.Profile));
break;
case SearchQuerySort.Default:
default:
results = results.OrderByDescending(x => …Run Code Online (Sandbox Code Playgroud) predicatebuilder ×10
c# ×5
linq ×5
linq-to-sql ×3
.net ×1
iqueryable ×1
linqkit ×1
search ×1
sitecore ×1
string ×1
t-sql ×1
umbraco ×1
where ×1