检查item是否为null或表是否包含任何匹配的数据

时间:2016-02-22 07:36:14

标签: c# .net linq

我已经得到了这个查询,我试图检查表TruckItems中是否有与变量tareTotal中的字符串值匹配的项目。

public QuoteResult GetTruckInformation(QuoteData data)
{
    QuoteResult qr = null;

    using (TruckDb db = new TruckDb())
    {
        var tareTotal = db.ChassisModel.Where(x => x.Id == data.ChassisId).FirstOrDefault();

        var items = (from x in db.TruckItems where x.Model == tareTotal.Name select x); //Issue lies here

        if (items.Any()) //Error here
        {
            var truckTareTotal = db.TruckItems.Where(x => x.Model == tareTotal.Name).FirstOrDefault().TareTotal;
            var truckGVM = db.TruckItems.Where(x => x.Model == tareTotal.Name).FirstOrDefault().GVM;

            var list = new QuoteResult
            {
                TareTotal = Convert.ToDouble(truckTareTotal),
                GVM = Convert.ToDouble(truckGVM)
            };
            qr = list;
        }
    }
    return qr;
}

我在if (items.Any())收到错误:

  

非静态方法需要目标。

我不完全理解我的问题,但我无法找到任何可以帮助我解决问题的方法。有人可以给我一些关于我的变量items做错的指示吗?谢谢!

修改

感谢大家帮助我!你所有的编码工作都非常好。我发现了我的问题,并且由于某种原因它与线程有关...

在我的客户端应用程序中,我在组合框选择更改事件中使用GetTruckInformation方法,并且由于某种原因,当它运行该事件时,我的服务器端应用程序在我的所有语句之间更改线程,从而导致所有我的数据为null

这是我的WPF /客户端方法,仅用于show:

private async void cmbChassisModel_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    using (TruckServiceClient service = new TruckServiceClient())
    {
        QuoteData data = new QuoteData();
        data.ChassisId = cmbChassisModel.GetDisplayItemId();
        var items = await service.GetTruckInformationAsync(data);
        if (items != null)
        {
            lblTareTotalAmount.Content = items.TareTotal;
            lblGVMAmount.Content = items.GVM;
        }
    }
}

没有人必须回答这个问题,我只是想让每个人都知道。 :)我会试着找出为什么会这样。 :)

4 个答案:

答案 0 :(得分:2)

在项目上使用.ToList()。像这样:

var items= db.TruckItems.Where(w=>w.Model == tareTotal.Name).ToList();

否则在执行.Any()

时可能会遇到麻烦

修改

只是为了到期。这样做:

if(tareTotal==null)
    throw new Exception("The tare total is null");
var items= db.TruckItems.Where(w=>w.Model == tareTotal.Name).ToList();

答案 1 :(得分:1)

如果没有与db.ChassisModel.Where(x => x.Id == data.ChassisId)匹配的项目,则tareTotal将为空 无论如何,如果你只想检查db.TruckItems是否包含tareTotal.Name,请使用它。这也改善了性能:
变化:

var items = (from x in db.TruckItems where x.Model == tareTotal.Name select x);
if (items.Any())

为:

if(db.TruckItems.Any(x => x.Model == tareTotal.Name))

答案 2 :(得分:1)

检查此优化方法:

<p>Simple XML will return a reference to an <i>object</i> containing:<p>
<blockquote>the node value and you cant use references in session variables</blockquote>
<p>as there is <b>no feasible</b> way to restore a reference to another variable.</p>

答案 3 :(得分:0)

简单:

var hasItems = (from x in db.TruckItems where x.Model == tareTotal.Name select x).Any();

如果你有至少一个符合你条件的物品,那将是真的。