Я использовал Linq для Entities много лет, но я впервые сталкиваюсь с этой проблемой.У меня есть таблицы Tips и Items , в каждом из которых может быть много элементов. У меня есть только 3 элемента в базе данных.при редактировании элемента я хочу убедиться, что поле GivenId является уникальным для элементов с одинаковым наконечником.Я использую это:
Item item =db.Items.FirstOrDefault(c => c.Id == id);
if (item != null)
{
if (db.Items
.Any(x => x.GivenId == newGivenId &&
x.Id != item.Id &&
x.TipId == item.TipId))
{
//newGivenId is either different or if it is the same,
//it belongs to the same item
}
else
{
//newGivenId already exists for an Item in the same tip
}
}
, но
db.Items
.FirstOrDefault(x => x.GivenId == newGivenId &&
x.Id != item.Id &&
x.TipId == item.TipId);
возвращает null
, как и ожидалось.
Я знаю, что могу использовать это как:
Item it = db.Items
.FirstOrDefault(x => x.GivenId == newGivenId &&
x.Id != item.Id &&
x.TipId == item.TipId);
if(it==null)
{
}
else
{
}
Но я просто хочу выяснить, что не так с Any
.
PS: Все Id
с (3 из них) typeof(int)
РЕДАКТИРОВАТЬ:
это сгенерированный sql запрос:
DECLARE @p__linq__0 AS SQL_VARIANT;
DECLARE @p__linq__1 AS SQL_VARIANT;
DECLARE @p__linq__2 AS SQL_VARIANT;
SET @p__linq__0 = NULL;
SET @p__linq__1 = NULL;
SET @p__linq__2 = NULL;
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Items] AS [Extent1]
WHERE ([Extent1].[GivenId] = @p__linq__0) AND ([Extent1].[Id] <> @p__linq__1) AND (([Extent1].[TipId] = @p__linq__2) OR (([Extent1].[TipId] IS NULL) AND (@p__linq__2 IS NULL)))
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
EF Сгенерированные классы:
public partial class Item
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Item()
{
this.Parts = new HashSet<Part>();
}
public int Id { get; set; }
public Nullable<int> TipId { get; set; }
public Nullable<int> GivenId { get; set; }
public string FileId { get; set; }
public Nullable<bool> Carve { get; set; }
public Nullable<bool> Mina { get; set; }
public Nullable<bool> Deleted { get; set; }
public virtual Tip Tip { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Part> Parts { get; set; }
}
public partial class Tip
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Tip()
{
this.Items = new HashSet<Item>();
}
public int Id { get; set; }
public string Name { get; set; }
public Nullable<int> ModelId { get; set; }
public Nullable<bool> Deleted { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Item> Items { get; set; }
public virtual Model Model { get; set; }
}