小编Joh*_*van的帖子

LINQ to Entities无法识别方法IsNullOrWhiteSpace

我有以下代码:

var countries = from c in db.Countries
    where (string.IsNullOrWhiteSpace(searchAlpha2) || (c.Alpha2 ?? string.Empty).ToUpper().Contains(searchAlpha2.ToUpper()))
    && (string.IsNullOrWhiteSpace(searchAlpha2) || (c.Alpha3 ?? string.Empty).ToUpper().Contains(searchAlpha3.ToUpper()))
    && (string.IsNullOrWhiteSpace(searchName) || (c.Name ?? string.Empty).ToUpper().Contains(searchName.ToUpper()))
    select c;
Run Code Online (Sandbox Code Playgroud)

此代码在SQL数据库上使用Entity Framework v6 Code First.

除了性能之外,如果我不包括IsNullOrWhitespace我在过滤条件为空时没有得到结果(我已经测试了空值和空值); 但是当值存在时,这可以按预期工作.

我收到错误:

LINQ to Entities does not recognize the method 'Boolean IsNullOrWhiteSpace(System.String)' method, and this method cannot be translated into a store expression.
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用searchXXX字符串来过滤列.我已经尝试过使用RegEx.IsMatch,SqlMethods.Like和下面的代码,但是所有这些都给我错误,说明这些函数是不允许的(错误来自EntityFramework.SqlServer或来自Linq to Entities).我已经看到很多帖子在这里成功完成了 - 所以我想知道我是否遗漏了一些基本的东西?

c# linq-to-entities linq-to-sql entity-framework-6 asp.net-mvc-5

5
推荐指数
2
解决办法
6382
查看次数

使用 Linq to SQL 将 FieldExpression 转换为 LambdaExpression 时出错

Unable to cast object of type 'System.Linq.Expressions.FieldExpression' to type 'System.Linq.Expressions.LambdaExpression'运行以下代码时出现错误。

这段代码的目的是让我过滤包含某些字符串的记录(实体框架代码优先/Linq to SQL)。

注意:我正在使用第三方库 LinqKit:http : //www.albahari.com/nutshell/predicatebuilder.aspx

FilterHelper<Country> helper = new FilterHelper<Country>();
helper.AddContains(searchAlpha2, c => c.Alpha2);
helper.AddContains(searchAlpha3, c => c.Alpha3);
helper.AddContains(searchName, c => c.Name);

IQueryable<Country> countries = db.Countries.AsExpandable().Where(helper.Predicate);
Run Code Online (Sandbox Code Playgroud)

...

public class FilterHelper<T>
{
    public delegate string GetColumn<T>(T item);

    private Expression<Func<T,bool>> predicate; 

    public FilterHelper()
    {
        this.predicate = PredicateBuilder.True<T>();
    }
    public void AddContains(string searchText, GetColumn<T> getColumn)
    {
        if (!string.IsNullOrWhiteSpace(searchText))
            predicate = predicate.And(c => getColumn(c) != null ? getColumn(c).Contains(searchText) : false); …
Run Code Online (Sandbox Code Playgroud)

c# lambda entity-framework linq-to-sql linqkit

5
推荐指数
1
解决办法
2764
查看次数

XQuery [nodes()]:'<eof>'附近的语法错误,期望一个步骤表达式

运行以下SQL/XPath查询将返回以下错误:

查询:

;WITH XMLNAMESPACES (
  'http://schemas.microsoft.com/win/2004/08/events/event' as ns
, default 'http://schemas.microsoft.com/win/2004/08/events/event'
)

select [Events].[Event].value('(./System/TimeCreated/@SystemTime)[1]','nvarchar(100)') EventTime
from @xml.nodes('/*/Event/') [Events]([Event])
Run Code Online (Sandbox Code Playgroud)

错误:

XQuery [nodes()]: Syntax error near '<eof>', expected a step expression.
Run Code Online (Sandbox Code Playgroud)

sql sql-server xpath syntax-error sql-server-2008

5
推荐指数
1
解决办法
1万
查看次数

BlipExtension架构URI的值:"28A0092B-C50C-407e-A947-70E740481C1C"

该类DocumentFormat.OpenXml.Drawing.BlipExtension有一个名为的属性Uri.在众多例子中,我看到了28A0092B-C50C-407e-A947-70E740481C1C使用的价值; 但从来没有发现这个值是什么/它是否重要,或者它是否是任意的,只是因为人们从现有的示例代码中复制粘贴而流行.

有谁知道这个GUID值的相关性是什么?

背景

我一直在修复遗留应用程序中的一个错误,并且一直在重构以删除一些代码的spaghettification.

在这样做的同时,我发现了一些硬编码的值; 插入到文档中的任何图像都会给出名称Koala.jpg.该系统与考拉无关; 意味着该人只是简单地复制粘贴了一些代码而没有考虑这些值的上下文/含义.另一个硬编码值是BlipExtension的Uri : 28A0092B-C50C-407e-A947-70E740481C1C. 我想确定这个GUID是否有任何特殊含义,或者它是否只是一个唯一值.谷歌搜索显示了许多示例代码中使用的这个值,但到目前为止,我还没有找到它的解释.以下示例结果.

查看BlipExtension文档并未提供有关如何找出此GUID /此引用的架构的详细信息. https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.blipextension.uri(v=office.14).aspx

.net vb.net drawing ms-word openxml

5
推荐指数
1
解决办法
1026
查看次数

为什么没有为所有返回任务的功能显示CS4014?

假设以下代码:

private async Task Test1Async() => await Task.Delay(1000).ConfigureAwait(false);
private Task Test2Async() => Test1Async();
Run Code Online (Sandbox Code Playgroud)

从功能上讲,这些功能完全相同,但是编译器对待调用这些方法的方式有所不同。以下代码可以编译,但是会发出CS4014警告:

private void Test() => Test1Async();   // CS4014 is shown
Run Code Online (Sandbox Code Playgroud)

它生成警告“ 因为未等待此调用,当前方法在调用完成之前继续运行 ”。这是一个适当的警告,因为它通常表明您的代码中存在缺陷。如果确实需要此行为,则可以使用以下代码解决它:

private void Test() => _ = Test1Async();   // CS4014 is not shown anymore
Run Code Online (Sandbox Code Playgroud)

将值分配给_是一个相对的新功能,指示有意忽略该值。

此代码不会引发CS4014:

private void Test() => Test2Async();   // CS4014 is not shown!
Run Code Online (Sandbox Code Playgroud)

当然,我可以重写所有方法以使用该async/await方法,但这会导致更多代码运行效率较低(由于async关键字生成的状态机)。也许我永远都不会忘记它,但是我的同事可能会再也不会得到触发器(或者我称之为不使用异步的第三方库)。

关于返回的任务使用情况的警告也有所不同。

有谁知道为什么对于Task不使用async关键字返回a的方法未生成此警告?

c# async-await

5
推荐指数
1
解决办法
311
查看次数

在 SQL 中使用 JSON 更新表

有没有办法使用 SQL 中的 JSON 字段更新表。

{
    "RelationshipType" : [ 
        {
            "ID" : 1,
            "FromID" : 70,
            "ToID" : 12
        },
        {
            "ID" : 3,
            "FromID" : 80,
            "ToID" : 1
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

表结构

ID    |    FromID    |    ToID    |
1     |     10       |     12     |
2     |     42       |     17     |
3     |    100       |     1      |
Run Code Online (Sandbox Code Playgroud)

如果我在 SQL 服务器中使用上面提到的 JSON 文件更新表,输出应该通过匹配FromIDID.

ID    |    FromID    |    ToID    |
1     |     70       |     12     |
2 …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server json

5
推荐指数
1
解决办法
5181
查看次数

应如何构建 OData URI?

我正在寻找构建 URI,例如https://example.com/data/customers?$top=100.

是否有UriBuilder用于创建 OData URI(即可以$适当处理诸如此类的字符)?

完整信息

我有这样的代码(简化示例):

public Uri CreateMyApiUri(string rootUri, string apiPath, string entity, int pageSize)
{
    var builder = new UriBuilder(rootUri);
    builder.Path = ConcatPathParts(builder.Path, apiPath, entity); //basically string.Join("/", args), plus code to remove superfluous slashes
    var parameters = HttpUtility.ParseQueryString(builder.Query);
    if (pageSize > 0) parameters["$top"] = pageSize.ToString();
    builder.Query = parameters.ToString();
    return builder.Uri; 
}
//called like this
var uri = CreateMyApiUri("https://example.com", "data", "customers", 100);
Run Code Online (Sandbox Code Playgroud)

但是,OData 特殊字符$会被编码为在 URI 中使用%24

我在 GitHub …

c# odata query-string querystringparameter uribuilder

5
推荐指数
1
解决办法
1988
查看次数

用于转义路径中字符的函数

PowerShell中是否有一个函数用于转义路径中的字符?

注意:我知道提供Path参数的大多数cmdlet 也提供了LiteralPath解决此问题的参数.这个问题更多来自好奇心而不是需要,就像我能想到的大多数用例一样,切换到LiteralPath有意义.但是有一些真正的用例(例如Start-BitsTransfer有一个Source参数,但没有文字等价物).

详情

如果我有一个文件c:\temp\test[0123].txt,而不是Get-Item 'c:\temp\test[0123].txt',我必须Get-Item 'c:\temp\test`[0123`].txt'用来获得结果(或使用LiteralPath参数).

甚至另一个PowerShell命令返回的路径也会返回一个未转义的字符串; 即Get-ChildItem 'c:\temp\' -Filter 'test*.txt' | Convert-Path | Get-Item失败(注意:如果我们传递实际FileSystemInfo对象全部工作,但该对象没有正确转义字符串路径的属性).

我们可以使用下面的代码轻松逃避:

$path = 'c:\temp\test[0123].txt'
$path = $path -replace '([][[])', '`$1' # escape square brackets by adding back ticks
Get-Item $path
Run Code Online (Sandbox Code Playgroud)

但是,当转义字符串时,标准建议是避免滚动自己的解决方案/使用语言解决这些问题的方法.

PowerShell中是否存在用于此目的的任何预先存在的功能,或任何推荐的接近此功能的方法; 或者是使用定制功能的唯一选择(例如下面)?

function ConvertFrom-LiteralPath {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$LiteralPath
    )
    process {
        (New-Object -TypeName 'PSObject' …
Run Code Online (Sandbox Code Playgroud)

powershell escaping path microsoft-bits powershell-3.0

4
推荐指数
1
解决办法
3172
查看次数

组合多个 Linq 表达式

我正在重构一些代码,试图使其更具自我记录性。当前代码对 OData 服务进行了查询,如下所示:

return context.MessageLog.Where
(
    x => 
    (
        x.Status == MessageStatus.Success 
        || x.Status == MessageStatus.Failure
    ) 
    && x.Direction == MessageDirection.Inbound 
    && x.ResponseDate == new DateTimeOffset(new DateTime(1900, 01, 01))
);
Run Code Online (Sandbox Code Playgroud)

我希望改变这一点以利用 Linq 表达式。
我可以将所有逻辑移动到单个表达式中并运行代码context.MessageLog.Where(MessageIsPendingResponse);。但是,我想为不同的条件创建表达式:(MessageIsProcessed即现在处于成功或失败状态)MessageIsInboundResponseNotYetSent(响应日期为空)。我可以将这些与多个 where 语句结合起来,如下所示:

return context.MessageLog
    .Where(MessageLogExpression.MessageIsProcessed)
    .Where(MessageLogExpression.MessageIsInbound)
    .Where(MessageLogExpression.ResponseNotYetSent);
Run Code Online (Sandbox Code Playgroud)

MessageLogExpression作为我用来包含这些预定义表达式的类)。

问题 1

这是组合语句的最佳方式,还是先过滤错误字段的风险(例如,Linq 是否将所有条件组合成单个查询并允许查询引擎(在 SQL 术语中)确定最佳执行计划;或我们是否强制它首先过滤状态字段?

问题2

以上对于我们AND加入表达式的场景非常有用;但是我们怎么做OR呢?我认为有一些方法可以将这些结合起来,但找不到任何明显的东西。我怀疑这样的事情存在吗?

return context.MessageLog.Where(new OrExpression(MessageIsSuccess,MessageIsFailure));
Run Code Online (Sandbox Code Playgroud)

问题 3

是否有一种在另一个表达式定义中组合表达式的好方法;例如像下面的代码(只有一个编译版本)?

public static Expression<Func<MessageLogRecord, bool>> MessageIsPendingResponse
{
    get
    {
        Expression<Func<MessageLogRecord, bool>> …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-expressions odata

4
推荐指数
1
解决办法
1746
查看次数

作为命令调用时,ScriptProperty 无法访问脚本的 cmdlet

给定代码,例如此 MRE:

function Get-One {1}
Update-TypeData -TypeName 'Demo' -MemberType 'ScriptProperty' -MemberName 'Test1' -Value {Get-Date}
Update-TypeData -TypeName 'Demo' -MemberType 'ScriptProperty' -MemberName 'Test2' -Value {Get-One}
$example = [PSCustomObject]@{PSTypeName = 'Demo'}
$example
Run Code Online (Sandbox Code Playgroud)

如果我调用它,pwsh -File '.\Demo.ps1'那么一切都会按您的预期工作/我得到以下输出:

Test1               Test2
-----               -----
2021-04-17 21:35:55     1
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用相同的命令来pwsh -Command '.\Demo.ps1'获取此命令(即 Test2 为空白);虽然我希望得到与上述相同的结果:

Test1               Test2
-----               -----
2021-04-17 21:35:55     
Run Code Online (Sandbox Code Playgroud)

即当我通过-Command参数调用时,ScriptProperty 无法访问脚本本身定义的 cmdlet/函数;虽然可以访问标准的(例如Get-Date)。

我认为这是一个错误;在 PWSH 和 PowerShell 中似乎只有相同的行为;这使得这种可能性小一点。

这是一个错误吗?或者我在理解中遗漏了什么。

powershell powershell-core powershell-5.1

4
推荐指数
1
解决办法
44
查看次数